/*
 * JugadorConectado.h
 *
 * Author: Grupo Nro.
 */

#ifndef JUGADORCONECTADO_H_
#define JUGADORCONECTADO_H_

#include "Thread.h"
#include "../common/Message.h"
#include "Campania.h"
#include <vector>

class Partida;
class JugadorThreadEnvio;
class JugadorThreadRecepcion;
class ServerThread;

class JugadorConectado {
private:
	JugadorThreadRecepcion * procesoEscucha;
	JugadorThreadEnvio *procesoEnvio;
	int idCampania;
	int idPartida;
	ServerThread* serverThread;
	int id;

public:
	JugadorConectado(int id, JugadorThreadRecepcion * procesoRecepcion,
			JugadorThreadEnvio * procesoEnvio, ServerThread* serverThread);
	virtual ~JugadorConectado();
	void start();
	void setIdCampania(int idCampania);
	int getIdCampania();
	void setIdPartida(int idPartida);
	int getIdPartida();
	void setId(int id);
	int getId();
	void enqueueEventMessage(Message m);
	// Guarda una nueva partida generada por el cliente al que representa
	// en la lista de partidas del servidor
	void agregarNuevaPartida(Partida* p);
	// Devuelve un vector de *Campania, estas campanias son consultadas al thread del servidor,
	// donde se guardan junto con las partidas en curso.
	std::vector<Campania*> getCampanias();
	// Consulta al thread del servidor las partidas existentes
	std::vector<Partida *> getPartidas();
	// Termina "grecefully" el thread
	void terminar();
	// Devuelve una partida segun el ID, consultando al servidor
	Partida* getPartidaPorID(int id);
	// Comunica a la partida que el actual jugador completo el minimo de jugadores
	// Este metodo es llamado desde el thread del cliente.
	void anunciarATodosJugadores();
	// Despierta el thread de escucha de mensajes, y le comunica al cliente
	// que la partida se completo de jugadores y puede comenzar
	void anounce();
	// pregunta al creador si se puede comenzar la partida
	bool solicitarComienzoDePartidaACreadorDePartida();
	// pregunta al cliente si puede comenzar la partida
	bool solicitarComienzoDePartida();
};

#endif /* JUGADORCONECTADO_H_ */
